﻿<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
	<title xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory">附录 I. 事件表示：org.w3c.dom.Node XML事件</title>
	<link rel="stylesheet" href="css/espertech.css" type="text/css">
	<meta xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" name="generator" content="DocBook XSL-NS Stylesheets V1.74.0">
	<meta xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<link rel="home" href="index.html" title="Esper参考文档">
	<link rel="up" href="index.html" title="Esper参考文档">
	<link rel="prev" href="appendix_eventrepavro.html" title="附录 H. 事件表示：Avro事件(org.apache.avro.generic.GenericData.Record)">
	<link rel="next" href="appendix_dotnet.html" title="附录 J. NEsper .NET特定信息">
</head>

<body>
	<p xmlns:d="http://docbook.org/ns/docbook" id="title"><a href="./index.html" class="site_href"><strong>www.espertech.com</strong></a><a href="http://www.espertech.com/esper/esper-documentation/" class="doc_href"><strong>文档</strong></a></p>
	<ul xmlns:d="http://docbook.org/ns/docbook" class="docnav">
		<li class="previous"><a accesskey="p" href="appendix_eventrepavro.html"><strong>上一页</strong></a></li>
		<li class="next"><a accesskey="n" href="appendix_dotnet.html"><strong>下一页</strong></a></li>
	</ul>
	<div class="appendix" lang="en-US">
		<div class="titlepage">
			<div>
				<div>
					<h2 class="title"><a id="appendix_eventrepxml"></a>附录 I. 事件表示：<code class="literal">org.w3c.dom.Node</code> XML事件</h2>
				</div>
			</div>
		</div><a id="d0e63823" class="indexterm"></a><a id="d0e63826" class="indexterm"></a>
		<p>
			本节提供使用<code class="literal">org.w3c.dom.Node</code> XML表示事件的信息。
		</p>
		<p>
			对于NEsper .NET，另见<a class="xref" href="appendix_dotnet.html#appendix_dotnet_eventrep_xml" title="J.10. .NET XML事件">章节 J.10 ".NET XML事件"</a>。
		</p>
		<div class="sect1" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title"><a id="appendix_eventrepxml_overview"></a>I.1. 概述</h2>
					</div>
				</div>
			</div>
			<p>
				事件可以表示为<code class="literal">org.w3c.dom.Node</code>实例，并通过<code class="literal">EPEventService</code>上的<code class="literal">sendEventXMLDOM</code>方法或通过<code class="literal">EventSender</code>发送到运行时。请注意，需要配置或带有注解的<code class="literal">create xml schema</code>以便知道事件类型名称和根元素名称。参见<a class="xref" href="configuration.html#configuration-common-eventtypexmldom" title="17.4.8. 由org.w3c.dom.Node表示的事件">章节 17.4.8 "由org.w3c.dom.Node表示的事件"</a>。
			</p>
			<p>
				如果XML模式文档(XSD文件)可以作为配置的一部分或<code class="literal">create xml schema</code>的一部分提供，则编译器和运行时可以读取模式并适当呈现事件类型元数据，并验证使用该事件类型及其属性的语句。参见<a class="xref" href="appendix_eventrepxml.html#appendix_eventrepxml_schema" title="I.2. 模式提供的XML事件">章节 I.2 "模式提供的XML事件"</a>。
			</p>
			<p>
				当没有提供XML模式文档时，仍然可以查询XML事件，但是属性表达式的返回类型和返回值仅为字符串类型，并且除了显式配置的属性外，没有其他事件类型元数据可用。参见<a class="xref" href="appendix_eventrepxml.html#appendix_eventrepxml_noschema" title="I.3. 无模式提供的XML事件">章节 I.3 "无模式提供的XML事件"</a>。
			</p>
			<p>
				在所有情况下，编译器和运行时允许您将显式XPath表达式配置为事件属性。您可以指定任意XPath函数或表达式，并提供属性名称和类型，以便在语句中使用结果值。参见<a class="xref" href="appendix_eventrepxml.html#appendix_eventrepxml_explicit" title="I.4. 显式配置的属性">章节 I.4 "显式配置的属性"</a>。
			</p>
			<p>
				嵌套、映射和索引事件属性也支持针对<code class="literal">org.w3c.dom.Node</code>事件的表达式。因此，可以通过属性表达式语法方便地查询XML树。
			</p>
			<p>
				每个根元素名称只能配置一个事件类型。
			</p>
			<p>
				本节使用以下XML文档作为示例：
			</p>
			<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;Sensor xmlns="SensorSchema"&gt;
  &lt;ID&gt;urn:epc:1:4.16.36&lt;/ID&gt;
  &lt;Observation Command="READ_PALLET_TAGS_ONLY"&gt;
    &lt;ID&gt;00000001&lt;/ID&gt;
    &lt;Tag&gt;
      &lt;ID&gt;urn:epc:1:2.24.400&lt;/ID&gt;
    &lt;/Tag&gt;
    &lt;Tag&gt;
      &lt;ID&gt;urn:epc:1:2.24.401&lt;/ID&gt;
    &lt;/Tag&gt;
  &lt;/Observation&gt;
&lt;/Sensor&gt;</pre>
			<p>
				该示例的模式为：
			</p>
			<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"&gt;

  &lt;xs:element name="Sensor"&gt;
    &lt;xs:complexType&gt;
      &lt;xs:sequence&gt;
        &lt;xs:element name="ID" type="xs:string"/&gt;
        &lt;xs:element ref="Observation" /&gt;
      &lt;/xs:sequence&gt;
    &lt;/xs:complexType&gt;
  &lt;/xs:element&gt;

  &lt;xs:element name="Observation"&gt;
    &lt;xs:complexType&gt;
      &lt;xs:sequence&gt;
        &lt;xs:element name="ID" type="xs:string"/&gt;
        &lt;xs:element ref="Tag" maxOccurs="unbounded" /&gt;
      &lt;/xs:sequence&gt;
      &lt;xs:attribute name="Command" type="xs:string" use="required" /&gt;
    &lt;/xs:complexType&gt;
  &lt;/xs:element&gt;

  &lt;xs:element name="Tag"&gt;
    &lt;xs:complexType&gt;
      &lt;xs:sequence&gt;
        &lt;xs:element name="ID" type="xs:string"/&gt;
      &lt;/xs:sequence&gt;
    &lt;/xs:complexType&gt;
  &lt;/xs:element&gt;
&lt;/xs:schema&gt;</pre>
		</div>
		<div class="sect1" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title"><a id="appendix_eventrepxml_schema"></a>I.2. 模式提供的XML事件</h2>
					</div>
				</div>
			</div>
			<p>
				如果您有XML事件的XSD模式文档可用，编译器和运行时可以查询该模式。好处包括：
			</p>
			<div class="itemizedlist">
				<ul compact="compact">
					<li>
						<p>
							引用事件属性的新语句将根据模式中提供的类型进行验证。
						</p>
					</li>
					<li>
						<p>
							事件类型元数据可作为<code class="literal">EventType</code>接口的一部分进行检索。
						</p>
					</li>
				</ul>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="appendix_eventrepxml_schema-start"></a>I.2.1. 入门</h3>
						</div>
					</div>
				</div>
				<p>
				编译器从您提供的URL读取XSD模式文件。确保XSD模式文件导入的文件也可以解析。
				</p>
				<div xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="note">
					<h2>注意</h2>
					<div class="itemizedlist">
						<ul>
							<li>
								<p>
									在类路径中包含<code class="literal">esper-common-xmlxsd-</code><span class="emphasis"><em>版本</em></span><code class="literal">.jar</code>和Apache Xerces2 Java jar文件<code class="literal">xercesImpl-</code><span class="emphasis"><em>xerces2版本</em></span><code class="literal">.jar</code>(以及<code class="literal">xml-apis</code> jar文件)。
								</p>
							</li>
							<li>
								<p>
									如<a class="xref" href="configuration.html#configuration-common-eventmeta-xmlxsd" title="17.4.9.3. XML XSD模式设置">章节 17.4.9.3 "XML XSD模式设置"</a>所述，在事件类型元配置中设置<code class="literal">enable-XMLXSD</code>标志。
								</p>
							</li>
						</ul>
					</div>
				</div>
				<p>
					配置和<code class="literal">create xml schema</code>接受模式URL。这是一个从类路径中的文件确定模式URL的示例代码片段：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">URL schemaURL = this.getClass().getClassLoader().getResource("sensor.xsd");
// 对于NEsper .NET，使用C# ResourceManager类加载资源</pre>
				<p>
					这是配置API的示例用法，更多示例请参见<a class="xref" href="configuration.html" title="第17章 配置">第17章 <i>配置</i></a>。
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">ConfigurationCommonEventTypeXMLDOM sensorcfg = new ConfigurationCommonEventTypeXMLDOM();
sensorcfg.setRootElementName("Sensor");
sensorcfg.setSchemaResource(schemaURL.toString());
Configuration configuration = new Configuration();
configuration.getCommon().addEventType("SensorEvent", sensorcfg);</pre>
				<p>
					这是<code class="literal">create xml </code> schema的示例用法。
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@XMLSchema(rootElementName='Sensor', schemaResource='some url value here')
create xml schema SensorEvent()</pre>
				<p>
					不需要有根元素名称。<code class="literal">sendEventXMLDOM(org.w3c.Node node, String eventTypeName)</code>方法接受事件类型名称。如果不需要基于根或文档元素名称的类型查找，<code class="literal">EventSender</code>是发送事件的有用替代方法。
				</p>
				<p>
					添加事件类型后，您可以创建语句并发送事件。接下来是一个示例语句：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">select ID, Observation.Command, Observation.ID, 
  Observation.Tag[0].ID, Observation.Tag[1].ID
from SensorEvent</pre>
				<p>
					如上面的示例所示，属性表达式可以查询XML文档元素和属性中保存的属性值。
				</p>
				<p>
					有多种方法可以从XML字符串获取XML DOM文档实例。下一个代码片段显示如何获取XML DOM <code class="literal">org.w3c.Document</code>实例：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">InputSource source = new InputSource(new StringReader(xml));
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true);
Document doc = builderFactory.newDocumentBuilder().parse(source);</pre>
				<p>
					将<code class="literal">org.w3c.Node</code>或<code class="literal">Document</code>对象发送到运行时进行处理：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">runtime.getEventService().sendEventXMLDOM(doc, "SensorEvent");</pre>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="appendix_eventrepxml_schema-propertyexpr"></a>I.2.2. 属性表达式和命名空间</h3>
						</div>
					</div>
				</div>
				<p>
					默认情况下，诸如<code class="literal">Observation.Tag[0].ID</code>之类的属性表达式由EPL提供的快速DOM遍历器实现评估。此DOM遍历器实现不支持命名空间。
				</p>
				<p>
					如果需要命名空间感知的DOM文档遍历，必须将<code class="literal">xpath-property-expr</code>配置选项设置为true(默认为false)。此标志使编译器和运行时从每个属性表达式生成命名空间感知的XPath表达式，而不是使用DOM遍历器，如下所述。将<code class="literal">xpath-property-expr</code>选项设置为true还需要您配置命名空间前缀，如下所述。
				</p>
				<p>
					当将属性名称与XSD模式信息匹配时，编译器确定是属性还是元素提供值。算法首先检查属性名称，然后是元素名称。它采用与指定属性名称匹配的第一个匹配项。
				</p>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="appendix_eventrepxml_schema-propertyexpr-xpath"></a>I.2.3. 属性表达式到XPath的重写</h3>
						</div>
					</div>
				</div>
				<p>
					通过设置<code class="literal">xpath-property-expr</code>选项，编译器将每个属性表达式重写为XPath表达式，有效地将评估交给类路径中可用的底层XPath实现。大多数JVM都有内置的XPath实现，还有优化的快速实现，如Jaxen也可以使用。
				</p>
				<p>
					如果您的模式混合了多个命名空间并且元素名称重叠，请设置<code class="literal">xpath-property-expr</code>选项。
				</p>
				<p>
					下表采样了几个属性表达式和为每个生成的XPath表达式，没有命名空间前缀以保持示例简单：
				</p>
				<div class="table"><a id="d0e64026"></a>
					<p class="title"><b>表 I.1. 属性表达式到XPath表达式</b></p>
					<div class="table-contents">
						<table summary="属性表达式到XPath表达式" border="1">
							<colgroup>
								<col>
								<col>
							</colgroup>
							<thead>
								<tr>
									<th>属性表达式</th>
									<th>等效XPath</th>
								</tr>
							</thead>
							<tbody>
								<tr>
									<td><code class="literal">Observeration.ID</code></td>
									<td><code class="literal">/Sensor/Observation/ID</code></td>
								</tr>
								<tr>
									<td><code class="literal">Observeration.Command</code></td>
									<td><code class="literal">/Sensor/Observation/@Command</code></td>
								</tr>
								<tr>
									<td><code class="literal">Observeration.Tag[0].ID</code></td>
									<td><code class="literal">/Sensor/Observation/Tag[position() = 1]/ID</code></td>
								</tr>
							</tbody>
						</table>
					</div>
				</div><br class="table-break">
				<p>
					对于通过语法<code class="literal">name('key')</code>指定的映射属性，算法查找名为<code class="literal">id</code>的属性，并生成XPath表达式为<code class="literal">mapped[@id='key']</code>。
				</p>
				<p>
					最后，这是一个包含所有不同类型属性及其在一个属性表达式中的XPath表达式等效的示例：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">select nested.mapped('key').indexed[1].attribute from MyEvent</pre>
				<p>
					等效的XPath表达式如下，这次包括<code class="literal">n0</code>作为示例命名空间前缀：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">/n0:rootelement/n0:nested/n0:mapped[@id='key']/n0:indexed[position() = 2]/@attribute</pre>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="appendix_eventrepxml_schema-propertyarray"></a>I.2.4. 数组属性</h3>
						</div>
					</div>
				</div>
				<p>
					在XSD模式中未绑定或最大出现次数大于1的所有元素都表示为索引属性，并且需要索引进行解析。
				</p>
				<p>
					例如，在示例Sensor文档中，以下不是有效的属性表达式：<code class="literal">Observeration.Tag.ID</code>。由于没有为<code class="literal">Tag</code>提供索引，属性表达式无效。
				</p>
				<p>
					父元素中重复元素的重复元素如果是简单类型，则也表示为数组。
				</p>
				<p>
					考虑下一个XML文档：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;item&gt;
&lt;book sku="8800090"&gt;
&lt;author&gt;Isaac Asimov&lt;/author&gt;
&lt;author&gt;Robert A Heinlein&lt;/author&gt;
&lt;/book&gt;
&lt;/item&gt;</pre>
				<p>
					在这里，表达式<code class="literal">book.author</code>的结果是一个String类型的数组，而<code class="literal">book.author[0]</code>的结果是一个String值。
				</p>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="appendix_eventrepxml_schema-propertydynamic"></a>I.2.5. 动态属性</h3>
						</div>
					</div>
				</div>
				<p>
					动态属性不会根据XSD模式信息进行验证，其结果值始终为<code class="literal">org.w3c.Node</code>。您可以使用用户定义的函数来处理返回<code class="literal">Node</code>的动态属性。作为替代方案，考虑使用显式属性。
				</p>
				<p>
					一个示例动态属性是<code class="literal">Origin?.ID</code>，它将查找名为<code class="literal">Origin</code>的元素，该元素包含名为<code class="literal">LocationCode</code>的元素或属性节点：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">select Origin?.LocationCode from SensorEvent</pre>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="appendix_eventrepxml_schema-propertytranspose"></a>I.2.6. 转置属性</h3>
						</div>
					</div>
				</div>
				<p>
					当提供XSD文档时，默认配置允许将本身是复杂元素的属性值(如XSD模式中所定义)转置到新流中。此行为可以通过<code class="literal">auto-fragment</code>标志控制。
				</p>
				<p>
					例如，考虑下一个语句：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">insert into ObservationStream
select ID, Observation from SensorEvent</pre>
				<p>
					<code class="literal">SensorEvent</code>的属性<code class="literal">Observation</code>本身被插入到名为<code class="literal">ObservationStream</code>的新流中。<code class="literal">ObservationStream</code>因此由字符串类型的<code class="literal">ID</code>属性和复杂类型的属性<code class="literal">Observation</code>组成，如模式中所述。
				</p>
				<p>
					可以使用此流进行查询的进一步语句：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">select Observation.Command, Observation.Tag[0].ID from ObservationStream</pre>
				<p>
					在继续讨论之前，这里是一个使用通配符选择的替代语法，也很有用：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">insert into TagListStream
select ID as sensorId, Observation.* from SensorEvent</pre>
				<p>
					新的<code class="literal">TagListStream</code>有一个字符串类型的<code class="literal">ID</code>和<code class="literal">Command</code>属性，以及一个<code class="literal">Tag</code>属性数组，这些属性本身是复杂类型，如模式中所定义。
				</p>
				<p>
					下一个是查询新流的示例语句：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">select sensorId, Command, Tag[0].ID from TagListStream</pre>
				<p>
					请注意以下限制：
				</p>
				<div class="itemizedlist">
					<ul compact="compact">
						<li>
							<p>
								XPath标准规定，针对<code class="literal">org.w3c.Node</code>的XPath表达式是针对<code class="literal">Node</code>的所有者文档进行评估的。因此，XPath不是相对于当前节点的，而是相对于每个节点的所有者文档的绝对路径。由于编译器和运行时不会为转置节点创建新的文档实例，因此当设置<code class="literal">xpath-property-expr</code>标志时，无法转置属性。
							</p>
						</li>
						<li>
							<p>
								具有简单元素值和复杂子元素的复杂元素不会被转置。这是为了确保它们的属性值不被隐藏。使用显式XPath表达式转置此类属性。
							</p>
						</li>
					</ul>
				</div>
				<p>
					EPL自动为转置属性注册新的事件类型。它从XML事件类型名称和表达式中使用的属性名称生成新XML事件类型的类型名称。概要为<span class="emphasis"><em>type_name.property_name[.property_name...]</em></span>。可以查找类型名称，例如用于<code class="literal">EventSender</code>，也可以提前创建。
				</p>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="appendix_eventrepxml_eventsender"></a>I.2.7. 事件发送器</h3>
						</div>
					</div>
				</div>
				<p>
					<code class="literal">EventSender</code>将事件发送到运行时以获取给定类型，节省了基于元素名称的类型查找。
				</p>
				<p>
					这个简短的示例通过<code class="literal">EventSender</code>发送事件：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">EventSender sender = epRuntime.getEventSender("SensorEvent");
sender.sendEvent(node);</pre>
				<p>
					XML DOM事件发送器在处理事件之前检查根元素名称。使用<code class="literal">event-sender-validates-root</code>设置禁用验证。这强制运行时根据任何预定义的类型处理XML文档，而不验证根元素名称。
				</p>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="appendix_eventrepxml_limitations"></a>I.2.8. 限制</h3>
						</div>
					</div>
				</div>
				<p>
					编译器模式查询基于Sun Java运行时中打包的Xerces发行版。除非您的应用程序在加载配置之前设置DOM实现注册表，如下所示，否则您的应用程序可能无法替换JRE的Xerces版本并使用XML模式：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">System.setProperty(DOMImplementationRegistry.PROPERTY, 
"com.sun.org.apache.xerces.internal.dom.DOMXSImplementationSourceImpl");</pre>
			</div>
		</div>
		<div class="sect1" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title"><a id="appendix_eventrepxml_noschema"></a>I.3. 无模式提供的XML事件</h2>
					</div>
				</div>
			</div>
			<p>
				没有模式文档时，仍然可以查询XML事件。但是没有模式文档时，元数据有重要差异，因此属性表达式结果也有差异。这些差异概述如下。
			</p>
			<p>
				针对没有模式的XML类型的所有属性表达式都被认为是有效的。除了语法验证外，没有对属性表达式进行验证。在运行时，属性表达式返回字符串类型的值或<code class="literal">null</code>，如果表达式没有产生匹配的元素或属性结果。
			</p>
			<p>
				当请求属性名称或属性元数据时，无模式类型返回空数组。
			</p>
			<p>
				在所有其他方面，该类型的行为与前面描述的由模式提供的类型相同。
			</p>
		</div>
		<div class="sect1" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title"><a id="appendix_eventrepxml_explicit"></a>I.4. 显式配置的属性</h2>
					</div>
				</div>
			</div>
			<p>
				无论您是否为XML事件类型提供XSD模式，您始终可以回退到配置由XPath表达式支持的显式属性。
			</p>
			<p>
				有关XPath的更多文档，请查阅XPath标准或其他在线材料。考虑使用Jaxen或Apache Axiom等，以提供比Java VM内置XPath提供程序更快的XPath评估。
			</p>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="appendix_eventrepxml_explicit-simple"></a>I.4.1. 简单显式属性</h3>
						</div>
					</div>
				</div>
				<p>
					下面是一个配置示例，添加了一个由XPath表达式支持的显式属性，并定义了命名空间前缀：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">ConfigurationCommonEventTypeXMLDOM sensorcfg = new ConfigurationCommonEventTypeXMLDOM();
sensorcfg.addXPathProperty("countTags", "count(/ss:Sensor/ss:Observation/ss:Tag)", 
    XPathConstants.NUMBER);
sensorcfg.addNamespacePrefix("ss", "SensorSchema");
sensorcfg.setRootElementName("Sensor");

Configuration configuration = new Configuration();
configuration.getCommon().addEventType("SensorEvent", sensorcfg);</pre>
				<p>
					下面是<code class="literal">create xml schema</code>的示例：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@XMLSchema(rootElementName='Sensor')
@XMLSchemaField(name='countTags', xpath='count(/ss:Sensor/ss:Observation/ss:Tag', type='number')
@XMLSchemaNamespacePrefix(prefix='ss', namespace='SensorSchema')
create xml schema SensorEvent();</pre>
				<p>
					现在可以查询<code class="literal">countTags</code>属性：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">select countTags from SensorEvent</pre>
				<p>
					XPath表达式<code class="literal">count(...)</code>是一个XPath内置函数，用于计算节点数量，对于示例文档，结果为<code class="literal">2</code>。
				</p>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="appendix_eventrepxml_explicit-casted"></a>I.4.2. 显式属性转换和解析</h3>
						</div>
					</div>
				</div>
				<p>
					编译器和运行时可以将XPath表达式的结果解析或转换为所需的类型。您的属性配置提供要转换的类型，如下所示：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">sensorcfg.addXPathProperty("countTags", "count(/ss:Sensor/ss:Observation/ss:Tag)", 
    XPathConstants.NUMBER, "int");</pre>
				<p>
					提供给属性配置的类型必须是内置类型之一。内置类型的数组也是可能的，要求XPath表达式返回<code class="literal">XPathConstants.NODESET</code>类型，如下所示：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">sensorcfg.addXPathProperty("idarray", "//ss:Tag/ss:ID", 
    XPathConstants.NODESET, "String[]");</pre>
				<p>
					这个EPL片段与上面的等效，用于<code class="literal">create xml schema</code>：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@XMLSchemaField(name='countTags', xpath='count(/ss:Sensor/ss:Observation/ss:Tag)', type='number', castToType='int')
@XMLSchemaField(name='idarray', xpath='//ss:Tag/ss:ID)', type='nodeset', castToType='string[]')</pre>
				<p>
					XPath表达式<code class="literal">//ss:Tag/ss:ID</code>返回Tag节点下的所有ID节点，无论它们在节点树中的位置如何。对于示例文档，结果为<code class="literal">2</code>个数组元素<code class="literal">urn:epc:1:2.24.400</code>和<code class="literal">urn:epc:1:2.24.40</code>。
				</p>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="appendix_eventrepxml_explicit-node"></a>I.4.3. 节点和节点集显式属性</h3>
						</div>
					</div>
				</div>
				<p>
					显式属性可以返回<code class="literal">XPathConstants.NODE</code>或<code class="literal">XPathConstants.NODESET</code>，并可以为属性提供预配置事件类型的事件类型名称。添加此类属性的方法名称为<code class="literal">addXPathPropertyFragment</code>。
				</p>
				<p>
					此代码片段添加了两个显式属性，并为每个属性分配了一个事件类型名称：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">sensorcfg.addXPathPropertyFragment("tagOne", "//ss:Tag[position() = 1]", 
    XPathConstants.NODE, "TagEvent");
sensorcfg.addXPathPropertyFragment("tagArray", "//ss:Tag", 
    XPathConstants.NODESET, "TagEvent");</pre>
				<p>
					此EPL片段与上面的等效，用于<code class="literal">create xml schema</code>：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@XMLSchemaField(name='tagOne', xpath='//ss:Tag[position() = 1]', type='node', eventTypeName='TagEvent')
@XMLSchemaField(name='tagArray', xpath='//ss:Tag', type='nodeset', eventTypeName='TagEvent')</pre>
				<p>
					上述配置或注解引用了<code class="literal">TagEvent</code>事件类型。此类型也必须配置或创建。在根元素名称前加上"//"会导致查找在嵌套模式元素中搜索类型定义：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">ConfigurationCommonEventTypeXMLDOM tagcfg = new ConfigurationCommonEventTypeXMLDOM();
tagcfg.setRootElementName("//Tag");
tagcfg.setSchemaResource(schemaURL);

Configuration configuration = new Configuration();
configuration.getCommon().addEventType("TagEvent", tagcfg);</pre>
				<p>
					现在<code class="literal">tagOne</code>和<code class="literal">tagArray</code>属性已准备好进行选择并转置到其他流：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">insert into TagOneStream select tagOne.* from SensorEvent</pre>
				<p>
					从新流中选择：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">select ID from TagOneStream</pre>
				<p>
					以下是带有索引属性的示例：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">insert into TagArrayStream select tagArray as mytags from SensorEvent</pre>
				<p>
					从新流中选择：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">select mytags[0].ID from TagArrayStream</pre>
			</div>
		</div>
		<div class="sect1" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title"><a id="appendix_eventrepxml_createschema"></a>I.5. 在<code class="literal">create xml schema</code>中使用XML模式注解</h2>
					</div>
				</div>
			</div>
			<p>
				有关使用<code class="literal">create xml schema</code>与<code class="literal">XMLSchema</code>、<code class="literal">XMLSchemaNamespacePrefix</code>和<code class="literal">XMLSchemaField</code>的更多信息，请参见<a class="xref" href="configuration.html#configuration-common-eventtypexmldom" title="17.4.8. 由org.w3c.dom.Node表示的事件">章节 17.4.8 "由org.w3c.dom.Node表示的事件"</a>。
			</p>
			<div xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="note">
				<h2>注意</h2>
				<div class="itemizedlist">
					<ul>
						<li>
							<p>
								<code class="literal">create xml schema</code>语句不允许指定事件属性。
							</p>
						</li>
						<li>
							<p>
								<code class="literal">create xml schema</code>语句不支持<code class="literal">copyfrom</code>和<code class="literal">inherits</code>。
							</p>
						</li>
					</ul>
				</div>
			</div>
		</div>
	</div>
	<ul xmlns:d="http://docbook.org/ns/docbook" class="docnav">
		<li class="previous"><a accesskey="p" href="appendix_eventrepavro.html"><strong>上一页</strong>附录 H. 事件表示：Avro事件(或...</a></li>
		<li class="up"><a accesskey="u" href="#"><strong>页首</strong></a></li>
		<li class="home"><a accesskey="h" href="index.html"><strong>首页</strong></a></li>
		<li class="next"><a accesskey="n" href="appendix_dotnet.html"><strong>下一页</strong>附录 J. NEsper .NET特定信息</a></li>
	</ul>
</body>

</html>